const mongoose = require("mongoose");
const Schema = mongoose.Schema;

const bcrypt = require('bcryptjs')

// 定义个schema 
// 一个schema 类似一个数据表
const UserSchema = new Schema({
  name: {
    type: String,
    unique: true,
    require: true
  },
  password: {
    type: String,
    require: true
  },
  token: {
    type: String
  }
});

/**
 * 添加用户保存时中间件对password进行bcrypt加密,这样保证用户密码只有用户本人知道
 * pre() 是mongodb 中 schema 的中间件，用来在写入前都要进行操作的方法
 * next() 是关键 承上启下的作用
 */
UserSchema.pre('save', function (next){
  let user = this;
  if (this.isModified('password') || this.isNew) {
    bcrypt.genSalt(10, function (err, salt) {
      if (err) {
        return next(err);
      }
      bcrypt.hash(user.password, salt, function (err, hash) {
        if (err) {
          return next(err);
        }
        user.password = hash;
        next();
      });
    })
  } else {
    return next();
  }
  // console.log('mongodb save')
  // next();
});

// 验证密码对密码进行校验
UserSchema.methods.comparePW = function (pw, cb) {
  bcrypt.compare(pw, this.password, (err, isMatch) => {
    if (err) {
      return cb(err);
    }
    cb(null, isMatch)
  })
}


mongoose.set('useCreateIndex', true);
// mongoose.model(name,schema,collection)
// 第一个参数是这个model 的名字，第一个参数首字母大写，
// 传入一个大写名词单数字符串用来表示你的数据库名称，mongoose会自动将大写单数名词字符串
// 生成 小写复数 的集合名称 例如这里的 User => users集合名称
// 第二个参数是schema 名字 架构的名称
// 第三个参数是你要连接的数据表（collection）的名字；
// 如果没有给第三个参数，那么
// 默认会把model 的第一个参数后面加一个s作为第三个参数
module.exports = mongoose.model('User', UserSchema);
// module.exports = mongoose.model("User", UserSchema, "user");
